// DoctorCommunicator.h
// 实现医生端通信的类，用于通过 TCP 协议与服务器通信

#include <QTcpSocket>   // 提供 TCP 客户端连接的功能
#include <QObject>      // 用于实现 Qt 的信号和槽机制
#include <QString>      // 用于处理文本数据（如请求和响应）

class DoctorCommunicator : public QObject
{
    Q_OBJECT  // 宏定义，用于启用 Qt 的信号和槽机制

public:
    // 构造函数：创建 DoctorCommunicator 实例
    // 参数 `serverAddress` 是服务器的 IP 地址或主机名
    // 参数 `port` 是服务器的监听端口
    DoctorCommunicator(const QString &serverAddress, quint16 port, QObject *parent = nullptr)
        : QObject(parent), socket(new QTcpSocket(this)) // 初始化 QTcpSocket 对象，将其父对象设置为当前对象
    {
        // 连接到服务器指定的 IP 地址和端口
        socket->connectToHost(serverAddress, port);

        // 当服务器有数据返回时，触发 readyRead 信号，调用 onReadyRead 槽函数处理响应
        connect(socket, &QTcpSocket::readyRead, this, &DoctorCommunicator::onReadyRead);
    }

    // 发送请求的函数
    // 参数 `request` 是请求的字符串形式，发送给服务器
    void sendRequest(const QString &request)
    {
        // 将请求字符串转换为 UTF-8 格式，并写入到 socket，发送给服务器
        socket->write(request.toUtf8());
    }

signals:
    // 响应信号，用于通知界面或其他对象服务器的响应内容
    // 参数 `response` 是从服务器接收的响应字符串
    void responseReceived(const QString &response);

private slots:
    // readyRead 信号的槽函数，用于读取服务器返回的数据
    void onReadyRead()
    {
        // 从 socket 中读取所有可用的数据，并将其转换为 UTF-8 格式字符串
        QString response = QString::fromUtf8(socket->readAll());

        // 发射 responseReceived 信号，将响应字符串传递出去
        emit responseReceived(response);
    }

private:
    QTcpSocket *socket;  // TCP 客户端 socket，用于与服务器通信
};
